package spark.core.rdd

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object rddMake {
  def main(args: Array[String]): Unit = {
    println("第一个spark程序")
    // TODO 1、从集合（内存）中创建RDD
    // 可以指定分区数量，若不指定 使用当前运行环境的最大可用CPU数
    // Spark主要提供了两个方法：parallelize和makeRDD
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("spark")
    val sparkContext = new SparkContext(sparkConf)
//    val rdd1 = sparkContext.parallelize(
//      List(1, 2, 3, 4)
//    )
//    val rdd2 = sparkContext.makeRDD(
//      List(1, 2, 3, 4)
//    )
// TODO 2、从文件中创建RDD
// 读取文件数据时，数据是按照Hadoop文件读取的规则进行切片分区，而切片规则和数据读取的规则有些差异
// 不指定时,使用默认参数(使用默认参数时,切片个数最大为2)
//
    val fileRDD: RDD[String] = sparkContext.textFile("Input/test.txt",4)
//    rdd1.collect().foreach(println)
//    rdd2.collect().foreach(println)
    fileRDD.collect().foreach(println)
    sparkContext.stop()
  }
  // TODO Spark中RDD分区数量的决定因素
  // 1、参数配置(并行度) 分区的默认个数等于对spark.default.parallelism的指定值
  // 2、根据父rdd的reduceTask数量 ：多少个reduce Task数量就有多少个RDD分区数
  // 3、读取hdfs的文件生成的rdd ：rdd分区的数量等于hdfs的文件的block
  // TODO 并行执行的任务数量
  // 并不是指的切分任务（Task）的数量：并行度可以小于Task数量或者大于Task数量。
  // 集群的总核心数（所有 Executor 的核心数之和）是决定最大并行度的关键因素 而Spark应用程序的并行度又由RDD的分区数决定。
  // 例如，如果集群有 10 个 Executor，每个 Executor 有 4 个Core，那么最大并行度为 40。

}
